<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 【变量声明let】
        // Es6新语法，用来声明变量。

        // 【作用】
        // 声明一个块级作用域的本地变量
        // 可以设置初始值

        // [语法]
        // 声明变量
        let x
        // 声明并设置初始值
        let a = 1

        console.log(a);
        // 重新赋值
        a = '感觉自己好傻'
        // 打印结果
        console.log(a);//感觉自己好傻

        // [注意点1-不允许重复声明]
        // let不允许在相同作用域内,重复声明同一个变量.
        // function func(){
        //     let a = 10;
        //     var a = 10;
        // }
        // function func(){
        //     let a = 10;
        //     let a  = 1;
        // }
        
        // [注意点2-有块级作用域]
        // 它的用法类似于var,但是所声明的变量,只能在let命令所在的代码块内有效.
        // 在下面的代码块中,分别用let和var声明了两个变量.
        {
            let a = 10;
            var b =1;
            console.log(a);
            console.log(b);
        }
        // console.log(a);//undefined
        // console.log(b);//1
        // 结果let声明的变量报错，var声明的变量返回了正确的值。
        // 这表面，let声明的变量只在它所在的代码块有效。
        // console.log(a)；//a is not defined
        //console.log(b)；//1
        //1【注意点3-不会变量提升】
        // var命令会发生“变量提升”现象，即变量可以在声明之前使用，值为underfined。
        //这种现象多多少少是有些奇怪的，按照一般的逻辑，变量应该在声明语句之后才可以使用。
        // var的情况广的里一正要在声明后使用，否则报错。
        // var的情况
        console.log(foo);
        var foo = 2;//undefined
        // let的情况
        console.log(bar);////Cannot access 'bar' before initialization(无法在初始化之前访问变let bar = 2;
        let car = 2;
        // 【总结】
        // 1.不能重复声明
        // 2.有块级作用域
        // 3.不会变量提升
    </script>
</body>
</html>